package com.ohc.leetcode.数组;

import java.util.Arrays;

/**
 * 2022年5月18日20:12:31
 */
public class 长度最小的子数组209 {

    /**
     * 2022年5月20日09:35:42
     * 输入：target = 7, nums = [2,3,1,2,4,3]
     * 输出：2
     * 解释：子数组 [4,3] 是该条件下的长度最小的子数组。
     *
     * @param target
     * @param nums
     * @return
     */
    public static int minSubArrayLen(int target, int[] nums) {
        Arrays.sort(nums);
        int sum = 0;
        int count = 0;
        int flag = 0;
        //             1 2 2 3 3 4
        for (int i = nums.length - 1; i >= 0; i--) {
            if (nums[i] == target) {   // 如果当前的数组元素相同就直接返回 那么最小子数组的长度就是1
                return 1;
            }


            for (int j = nums.length - 1; j >= 0; j--) {
                if (sum >= target) {  // 遍历的过程中找到了就直接返回
                    return count;
                }

                sum += nums[j];

                flag = 1; // 进入了统计说明就可以直接返回
                count++;


            }
            if (flag == 1 & sum >= target & i == 0) { // 遍历后整个数组才找到，才进行返回
                return count;
            }
            // 否则继续寻找
            sum = 0;
            count = 0;
        }


        return 0;
    }

    public static int minSubArrayLen2(int s, int[] nums) {
        Arrays.sort(nums);
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            int sum = nums[i];
            if (sum >= s)
                return 1;
            for (int j = i + 1; j < nums.length; j++) {
                sum += nums[j];
                if (sum >= s) {
                    min = Math.min(min, j - i + 1);
                    break;
                }
            }
        }
        return min == Integer.MAX_VALUE ? 0 : min;
    }


    public static int minSubArrayLen3(int target, int[] nums) {
        int result = Integer.MAX_VALUE;  // 返回的结果
        int subLen = 0;  // 子序列
        int sum = 0; // 总和
        for (int i = 0; i < nums.length; i++) {
                    sum = 0;

            for (int j = i; j < nums.length; j++) {
                sum += nums[j];
                if (sum >= target) {
                    subLen = j - i + 1;
                    result = result < subLen ? result : subLen;
                    break;

                }
            }
        }

        return result == Integer.
                MAX_VALUE ? 0 : result;
    }

    //213
//        [12,28,83,4,25,26,25,2,25,25,25,12]
    public static void main(String[] args) {
        int[] nums = new int[]{12, 28, 83, 4, 25, 26, 25, 2, 25, 25, 25, 12};
        int i = minSubArrayLen3(213, nums);
        System.out.println("i = " + i);


    }
}
